/**
 * @file serial_data.h
 * @author 范文宇 (2643660853@qq.com)
 * @brief
 * @version 1.0
 * @date 2022-12-02
 *
 * @copyright Copyright (c) 2022
 *
 */
#pragma once

#include "protocol.h"
#include "serial_port.h"
// 接收协议
struct ReceiveData
{
    float yaw;                  // 陀螺仪 - yaw 角度
    float goalx;                // 云台手的目标点x坐标
    float goaly;                // 云台手的目标点y坐标
    float time;                 // 当前比赛剩余时间
    float hp_sentry;            // 哨兵机器人的血量
    float hp_outpost;           // 己方前哨站的血量
    float total_emission;       // 发弹量
    uint8_t tracker_bit;        // 哨兵停止位
    uint8_t color;              // 队方颜色
    uint8_t target_destination; // 目标地点，目的在于方便云台手让哨兵一键到达目的地，0表示资源岛，1表示上坡巡逻，必须要让此时模式为路径规划模式
    uint8_t change_mode;        // 模式切换标志位，0表示路径规划模式，1表示跟随模式，2表示射击模式
    uint8_t target_mode;        // 云台相机是否有目标
    uint8_t is_mapping;         // 是否开启建图
} __attribute__((packed));

// 发送协议
#pragma pack(1)
struct SendData
{
    uint8_t is_grab; // 目标状态模式
    uint8_t end;
};
#pragma pack()

// 哨兵机器人协议数据包
class SerialData : public protocol
{
private:
    ReceiveData __receive_data; // 视觉接收数据
    SendData __send_data;       // 视觉发送数据
    SerialPort __serial_port;   // 串口
    TransferData __last_data;   // 上一帧的传递数据
    bool __is_init = false;     // 是否初始化

public:
    /**
     *
     * @brief 构造函数
     */
    SerialData() : protocol() {}

    /**
     * @brief 读取串口
     *
     * @param head 头帧
     * @param tail 尾帧
     */
    TransferData read() override;

    /**
     * @brief 写入串口
     *
     * @param transfer_data 传递数据
     */
    void write(const TransferData &transfer_data) override;

    bool isOpened() override;
};
inline SerialData serialdata;
